// EventEmitter 的核心就是事件触发与事件监听器功能的封装。//event.js 文件
// var EventEmitter = require('events').EventEmitter; 
// var event = new EventEmitter(); 
// event.on('some_event', function() { 
//     console.log('some_event 事件触发 插入setTimeout 这个方法中'); 
// }); 
// setTimeout(function() { 
//     console.log(1)
//     event.emit('some_event'); 
//     console.log(2)
// }, 1000); 


// event.js 文件
// var events = require('events'); 
// var emitter = new events.EventEmitter(); 

// emitter.on('someEvent', function(arg1, arg2) { 
//     console.log('listener1', arg1, arg2); 
// }); 
// emitter.on('someEvent', function(arg1, arg2) { 
//     console.log('listener2', arg1, arg2); 
// }); 
// emitter.emit('someEvent', '形参', 'arg2 参数'); 

//监听执行移除连接
var events = require('events');
var eventEmitter = new events.EventEmitter();
eventEmitter.emit('error');  //error事件 异常，退出程序并输出错误信息。
// eventEmitter.emit('error'); //错误先行
// 监听器 #1
var listener1 = function listener1() {
    console.log('监听器 listener1 执行。');
}

// 监听器 #2
var listener2 = function listener2() {
    console.log('监听器 listener2 执行。');
}

// 绑定发布 con1 事件listener1，处理函数为 listener1 
eventEmitter.addListener('con', listener1);

// 绑定发布名称 con   发布事件listener2，处理函数为 listener2
eventEmitter.on('con', listener2);
// listenerCount监听长度 con1
var eventListeners = eventEmitter.listenerCount('con');


console.log(eventListeners + " 监听的长度");

eventListeners = eventEmitter.listeners('con');

console.log(eventListeners + "监听的数组上面的俩个函数listener1,listener2");

// 订阅到 con 事件 
eventEmitter.emit('con');//执行 监听1

// removeListener监绑定con对象取下订阅listener1， con1 函数
eventEmitter.removeListener('con', listener1);

console.log("listener1 不再受监听。");

// 触发连接事件
eventEmitter.emit('con');

// 在监听con1
eventListeners = eventEmitter.listenerCount('con');
console.log(eventListeners + " 个监听器监听连接事件。");

console.log("程序执行完毕。");
//44连接   47监听执行  51 list1监听 54触发连接 57connection连接事件
// 类似php的数组关系
// addListener          ==   push 
// on                   ==   (数组名，数组值)
// emit                 ==   (数组名，数组值，多个)按顺序调用这个数组里面的所有方法
// once                 ==   (数组名，数组值)，emit执行手立即删除这个 数组值
// removeListener       ==   (数组名，数组值),删除这个数组值，移除的必须是注册过的,会改变数组索引
// removeAllListeners   ==   (数组名)，移除所有的值
// setMaxListeners      ==   (n)    ,监听个数超过十个会警告，可以自定义
// listenerCount        ==   (数组名) ，监听的数组长度
// listener             ==   (数组名) ，返回这个数组的值显示所有的函数
// newListener          ==   在添加新的监听器时候触发